<?php
/**
 * @see Zend_Form_Element_Xhtml
 */
require_once "Zend/Form/Element/Xhtml.php";

/**
 * Элемент формы, реализующий множественный выбор элементов субформ
 * 
 * @category Phorm
 * @package JQuery_Form_Element
 * @name /Phorm/JQuery/Form/Element/MultiElement.php
 * @copyright phorm.ru
 * @since 13.03.2012
 * @author vladimir@kachalov.net
 */

class Phorm_JQuery_Form_Element_MultiElement extends Zend_Form_Element_Xhtml {
	
	/**
	 * Имя метода - помощника вида
	 * @var string
	 */
	public $helper = "multiElement";
	
	/**
	 * Объект переводчика
	 * @var Zend_Translate
	 */
	public $translate;
	
	/**
	 * Массив объектов формы для каждой группы дополнительных элементов
	 * @var array
	 */
	public $forms = array();
	
	/**
	 * Объект формы дополнительных элементов
	 * @var Phorm_Form
	 */
	public $form;
	
	/**
	 * Отрендеренная форма дополнительных элементов
	 * @var string
	 */
	public $renderform = '';
	
	/**
	 * Определяем массив опций и дергаем родительский конструктор
	 *
	 * @param mixed $spec
	 * @param array $options
	 */
	
	public function __construct($spec, $options = null) {
		
		$this->translate = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('Translate');

		/**
		 * Выделяем дополнительные элементы в отдельную форму и рендерим ее
		 */
		
		require_once 'Phorm/Form.php';
		
		if(isset($options['elements']) && is_array($options['elements'])) {
			
			$config = array(
				'elements' =>$options['elements'],
			);
			
			if(isset($options['paths']['prefixPath'])) {
				$config['prefixPath'] = array_values($options['paths']['prefixPath']);
			}
			
			if(isset($options['paths']['elementPrefixPath'])) {
				$config['elementPrefixPath'] = array_values($options['paths']['elementPrefixPath']);
			}
			
			/*foreach ($options as $key=>$option) {
				if(!in_array($key,array('elements','prefixPath','elementPrefixPath'))) {
					unset($options[$key]);
				}
			}*/
			
			$form = new Phorm_Form(null,null,$config);
			
			$form -> removeDecorator('Form');
		    $form -> removeDecorator('DtDdWrapper');
			$form -> setElementsBelongTo($spec.'[]');
			
			$this->renderform = $form->render() . '<div class="clear"></div>';
			unset($options['elements'],$config['elements']);
			
			foreach ($form->getElements() as $element) {
				$element->setAttrib('id',null);
			}
			
			$this->form = $form;
		}
		
		/**
		 * Инициализируем родительский конструктор
		 */
		
		parent::__construct($spec, $options);
		
	}
	
	
	/**
	 * Валидация элемента
	 *
	 * @param mixed $value
	 * @return boolean
	 */
	
	public function isValid($value) {
		
		$this->setValue($value);
        $value = $this->getValue();
		
		if(!is_array($value) && $this->isRequired()) {
			$this->_messages = array($this->translate->_('Значение обязательно для заполнения и не может быть пустым'));
			return false;
		}
		
		$result = true;
		
		$this->_messages = array();
        $this->_errors   = array();
        
        if(is_array($value)) {
	        foreach ($value as $key=>$mini_form) {	
	        	if(key_exists($key,$this->forms)) {
	        		$form = $this->forms[$key];
	        		if(!$form->isValid($mini_form)) $result = false;
	        	}
			}
        }
		
		return $result;
		
	}
	
	/**
     * Set element value
     *
     * @param  array $value
     * @return Zend_Form_Element
     */
	
    public function setValue($value) {
    	
    	if(!is_array($value)) return $this;
    	
        $this->_value = $value;
        
        foreach ($value as $mini_form) {	
	        $form = clone $this->form;
	        $this->forms[] = $form->setDefaults($mini_form);
		}
        
        return $this;
        
    }
	
}